package com.kylin.common.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.log4j.Logger;

import com.kylin.common.exception.BusinessException;
import com.kylin.common.exception.SystemException;

public class FileOperater {
	protected static Logger log = Logger.getLogger(FileOperater.class);

	/**
	 * 保存上传的文件
	 * @param imgType 不同种类文件,按此分目录,参见 Constants
	 * @param in   IO输入流
	 * @param name 上传文件的名称 
	 * @return
	 * @throws BusinessException 
	 * @throws IOException
	 */
	public static String saveUploadFile(String fileType,InputStream in,String name) throws BusinessException{
		String ext = getExt(name);
		checkUploadFileType( fileType,ext);
		String fileName = getFilePathInDir(fileType , ext);
		try{
			saveFile(fileType,in, fileName);
			in.close();
		}catch(IOException e){
			throw new SystemException("保存文件失败："+e,e);
		}
		log.info("保存("+fileType+")文件成功：" + fileName);
		return fileName;
	}
	
	private static void checkUploadFileType(String fileType,String fileExt) throws BusinessException{
		boolean allow = false;
//		if(Constants.IMG_AD.equals(fileType)
//				   || Constants.IMG_COMPANYAD.equals(fileType)
//				   || Constants.IMG_COMPANYLOGO.equals(fileType)
//				   || Constants.IMG_MEMBERLOGO.equals(fileType)
//				   || Constants.IMG_POST.equals(fileType)
//				   || Constants.IMG_PRODUCT.equals(fileType)
//				   || Constants.IMG_SPECIAL.equals(fileType)
//		   ){
			for(int i=0;i<Config.allowImageTypes.size();i++){
				if( ((String)Config.allowImageTypes.get(i)).equals(fileExt) )
					allow = true;
			}
//		}else if(Constants.MEDIA_ARTICLE.equals(fileType)
//			    || Constants.MEDIA_COURSE.equals(fileType)
//			    || Constants.MEDIA_VOCABUL.equals(fileType)
//		){
			for(int i=0;i<Config.allowMediaTypes.size();i++){
				if( ((String)Config.allowMediaTypes.get(i)).equals(fileExt) )
					allow = true;
			}
//		}else{
//			throw new BusinessException("未在 FileOperater 或 Constants和配置文件 内登记的类型");
//		}
		if(! allow)
			throw new BusinessException("不允许上传的文件类型");
	}
	
	/**
	 * 更改文件
	 * @param fileType 不同种类文件,按此分目录,参见 Constants
	 * @param in      IO输入流
	 * @param name    新文件名称
	 * @param oldFile 旧文件相对路径
	 * @return
	 * @throws BusinessException 
	 */
	public static String updateUploadFile(String fileType,InputStream in ,String name,String oldFile) throws BusinessException{
		String newFileName = saveUploadFile(fileType,in, name);
		String oldFilePath = Config.uploadFileDir + fileType + File.separator + oldFile;
		log.debug("删除旧的("+fileType+")文件：" + oldFilePath);
		File old = new File(oldFilePath);
		if(old.exists())
			old.delete();
		return newFileName;
	}
	
	/**
	 * 将文件保存到磁盘
	 * @param imgType 不同种类文件,按此分目录,参见 Constants
	 * @param in 输入数据流
	 * @param fileName 文件保存的物理路径
	 * @throws IOException
	 */
	private static void saveFile(String imgType,InputStream in,String fileName) throws IOException{
		String path = Config.uploadFileDir + imgType + File.separator + fileName;
		log.info("保存上传文件路径："+path);
		FileOutputStream fout = new FileOutputStream(path);
		int b = in.read();
		while(b != -1){
			fout.write(b);
			b = in.read();
		}
		fout.close();
	}
	
	private static String getExt(String fileName){
		String ext = "";
		int idx = fileName.lastIndexOf(".");
		if (idx > 0 && idx < fileName.length()) {
			ext = fileName.substring(idx + 1, fileName.length());
		}
		return ext;
	}
	
	
	/**
	 * 删除文件
	 * @param in
	 * @param id
	 * @param ext
	 * @return
	 * @throws IOException
	 */
	public static String deleteFile(String fileType,String fileName) throws IOException{
		File old = new File(Config.uploadFileDir + fileType + File.separator + fileName);
		log.debug("删除("+fileType+")文件->"+ old.getPath());
		boolean rs = old.delete();
		log.debug("删除文件-> "+rs);
		return fileName;
	}
	
	/**
	 * 按规则获得文件存放路径(此路径非绝对路径，而是相对于存放文件根目录下的路径)
	 * 在不同种类下按当前的年月创建目录
	 * @param imgType 不同种类文件,按此分目录,参见 Constants
	 * @param ext   文件扩展名
	 * @return
	 */
	public static String getFilePathInDir(String imgType, String ext){
		SimpleDateFormat format = new SimpleDateFormat("yyyyMM");
		String filePath =  format.format(new Date()) ;
		File dir = new File(Config.uploadFileDir + imgType + File.separator + filePath);
		if(! dir.exists())
			dir.mkdirs();
		return filePath + File.separator + UUID.create(imgType) + "." + ext;
	}
	
	/**
	 * 读取 激活用户的通知邮件的 模版内容
	 * @return
	 * @throws IOException
	 */
	public static String getActivationMailFileContent(String language)  {
		if(Config.getString("mailTempletDir") == null 
				|| Config.getString("mailTempletDir").equals(""))
			throw new SystemException("缺少邮件模版存放的配置信息");
		String path = Config.homePath + Config.getString("mailTempletDir");
		String fileName=Config.getString("activationTempletFile");
		if(language != null)
			fileName += "."+language;
		try{
		FileInputStream fin = new FileInputStream(path + fileName);
		if(fin == null || fin.available() < 1)
			return "";
		byte[] content = new byte[fin.available()];
		fin.read(content);
		return new String(content,"UTF-8");
		}catch(IOException e){
			throw new SystemException("读取激活邮件的模版文件失败："+e.getMessage(),e);
		}
	}
	
	/**
	 * 读取 发送找回密码的邮件的 模版内容
	 * @return
	 * @throws IOException
	 */
	public static String getSendPasswordMailFileContent(String language)  {
		if(Config.getString("mailTempletDir") == null 
				|| Config.getString("mailTempletDir").equals(""))
			throw new SystemException("缺少邮件模版存放的配置信息");
		String path = Config.homePath + Config.getString("mailTempletDir");
		String fileName=Config.getString("sendPasswordTempletFile");
		if(language != null)
			fileName += "."+language;
		try{
		FileInputStream fin = new FileInputStream(path + fileName);
		if(fin == null || fin.available() < 1)
			return "";
		byte[] content = new byte[fin.available()];
		fin.read(content);
		return new String(content,"UTF-8");
		}catch(IOException e){
			throw new SystemException("读取发送找回密码邮件的模版文件失败："+e.getMessage(),e);
		}
	}
	
	public static void main(String[]s) throws Exception{
		File dir = new File("d:\\temp");
		File file = new File(dir,"\\aa\\bb");
		if(!file.exists())
			file.mkdirs();
		//file.createNewFile();
		System.out.print("\n------over-------");
	}
}
